package com.hxjy.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 通用数据库操作模版接口
 * @author 李彬
 */
@SuppressWarnings("unchecked")
public interface CommonDao {
	/**
	 * 
	 * 方法描述:页面包含自定义查询时调用此方法(不含分页)
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:50:15 PM
	 */
	public List customQuery(String sql,List<Object> params,Class clazz);
	/**
	 * 
	 * 方法描述:页面不包含自定义查询时调用此方法(不含分页)
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:50:15 PM
	 */
	public List query(String sql,Object[] objs,Class clazz);
	/**
	 * 
	 * 方法描述:页面不包含自定义查询时调用此方法(含分页)
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:50:15 PM
	 */
	public Object[] query(String sql,String countSql,int offset,Class clazz);
	/**
	 * 
	 * 方法描述:页面包含自定义查询时调用此方法(含分页)
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:50:15 PM
	 */
	public Object[] customQuery(String sql,String countSql,List<Object> params,Class clazz);
	
	/**
	 * 方法描述:获取服务器数据库时间--暂时不用
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:05 PM
	 */
	public String getTimeFromDB();
	
	/**
	 * 
	 * 类描述:计算结果集的个数--无参
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:14 PM
	 */
	public int count(String sql);
	/**
	 * 
	 * 类描述:计算结果集的个数--有参
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:14 PM
	 */
	public int count(String sql,Object[] objs);
	
	
	/**
	 * 
	 * 方法描述:自己封装的动态BEAN方法--慎用
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:05 PM
	 */
	public List<Object> listForCustom(final String sql);
	/**
	 * 
	 * 方法描述:对listForCustom的一个转换--慎用
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:10 PM
	 */
	public Map<Object,Object> listForCustomToMap(final List<Object> list);
	
//---------------------------以下是对Hibernate的数据操作进行的封装-------------------------------------------------------------------------------------//
	/**
	 * 类描述:保存一个对象
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:26:57 PM
	 */
	public void save(final Object obj);
	/**
	 * 类描述:删除一个对象
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:27:11 PM
	 */
	public void delete(final Object obj);
	/**
	 * 
	 * 方法描述:更新一个对象
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:27:48 PM
	 */
	public void update(final Object obj);
	/**
	 * 
	 * 类描述:根据HQL获取结果集--无参
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:27:51 PM
	 */
	public List<Object> list(final String hql);
	/**
	 * 
	 * 方法描述:根据主键ID获取表的一条数据
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:27:55 PM
	 */
	public <T> T get(final Class<T> clazz, final Serializable id);
	
	/**
	 * 
	 * 方法描述:保存一个结果集
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:18 PM
	 */
	public void saveAll(final List<Object> entities);
	/**
	 * 
	 * 方法描述:更新一个结果集--慎用
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:22 PM
	 */
	public void updateAll(final List<Object> entities);
	/**
	 * 
	 * 方法描述:删除一个结果集--慎用
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:25 PM
	 */
	public void delete(final List<Object> entities);
	/**
	 * 
	 * 方法类描述:根据HQL，如果是更新句语就执行更新气操作，如果是删除语句就执行删除语句
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:29 PM
	 */
	public void updateOrDeleteByHql(final String hql, final List<Object> params);
	/**
	 * 方法描述:根据HQL更新数据
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:33 PM
	 */
	public void updateByHql(final String hql,final List<Object> params);
	/**
	 * 
	 * 方法描述:根据HQL获取结果集--有参
	 * 创建人:李彬
	 * 创建时间：Apr 8, 20132:28:36 PM
	 */
	public List<Object> find(final String hql, final List<Object> params);
	
	public void saveOrUpdate(Object object);

}
